home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / psion / syscalls.1 < prev    next >
Text File  |  1995-03-31  |  36KB  |  1,050 lines

  1. PSIONICS FILE - SYSCALLS.1
  2. ==========================
  3. System calls (part 1)
  4. Last modified 1994-09-06
  5. ========================
  6.  
  7. The Psion System 3 operating system offers a large number of system calls.
  8.  
  9. A system call is identified by either a "function number" or by a "function
  10. number and a "subfunction number". These are abbreviated to "Fn" and "Sub"
  11. in the descriptions of system calls.
  12.  
  13. Each call can take up to 5 word parameters, called BX, CX, DX, SI, and DI.
  14. In addition, there may be up to two byte parameters (AH and AL) or an
  15. additional word parameter (AX). The values returned from the call have the
  16. same structure; in addition, there is an error flag and three result flags
  17. (the latter are only used by a few system calls). Note that AX is equivalent
  18. to (AH * 256 + AL); the description will use whichever is most convenient.
  19.  
  20. There are two OPL keywords for making system calls: CALL and OS. They access
  21. the same system calls, and differ only in the way in which the parameters are
  22. passed and the results returned.
  23.  
  24. The CALL keyword takes from 1 to 6 arguments. If an argument is omitted, the
  25. corresponding parameter is set to an undefined value. The first argument
  26. should be one of:
  27.     Fn
  28.     Fn + 256 * Sub
  29.     Fn + 256 * AH
  30. according to the specific system call. The remaining arguments provide the
  31. word parameters:
  32.     argument 2: BX
  33.     argument 3: CX
  34.     argument 4: DX
  35.     argument 5: SI
  36.     argument 6: DI
  37. The keyword returns a value, which is one of the results:
  38.     AX
  39.     AH * 256 + AL
  40. (which are equivalent). The flags and the other 5 results are not available.
  41.  
  42. OS takes two or three arguments; if there is no third, it is taken to be
  43. identical to the second. The first argument is Fn, while the second and third
  44. are each the address of a 12 byte buffer, holding the parameters and results
  45. respectively:
  46.   Offset  0 (word): one of:
  47.     Sub * 256 + AL    (parameters only)
  48.     AX                (parameters and results)
  49.     AH * 256 + AL     (parameters and results)
  50.   Offset  2 (word): BX
  51.   Offset  4 (word): CX
  52.   Offset  6 (word): DX
  53.   Offset  8 (word): SI
  54.   Offset 10 (word): DI
  55. The keyword returns a value which represents the error or result flags.
  56. Each flag is held in a specific bit of the value; the remaining bits are
  57. unspecified:
  58.     Bit  0: UL flag or error flag (depending on context)
  59.     Bit  6: EQ flag
  60.     Bit  7: SL flag
  61. Thus, if the call can fail, it has failed if the returned value is odd.
  62.  
  63. When a parameter or result is described as a cstr, a qstr, a buffer, or any
  64. other construct requiring more than 2 bytes, the actual parameter or result is
  65. the address of the construct.
  66.  
  67.  
  68. The system calls are described in a standard form. The first line gives the
  69. following information:
  70. * the Fn value
  71. * the Sub value if any
  72. The second line gives the following:
  73. * The name given to the call by the SDK.
  74. * A note such as "v3.1" giving the first version of the operating system
  75.   to support the call; if omitted, all versions support it.
  76. * The word "fails" if the call can fail; if omitted, the call never fails.
  77.   - If a call can fail, then the error flag shows whether or not it did so. If
  78.     it failed, AL holds an error code between 128 and 255; this is normally
  79.     treated as a negative number between -1 and -128, found by evaluating
  80.     the expression (AX OR $FF00). AH, and any of the 5 word results that the
  81.     call would have changed, are unspecified.
  82.   - If a call cannot fail, the error flag may still be set; this should be
  83.     ignored.
  84.   - Even if a call cannot fail, bad parameters can cause a system panic.
  85. * The word "async" if the call is always asynchronous, or the word "vsync" if
  86.   it is sometimes asynchronous; if omitted, the call is synchronous.
  87.   - A synchronous call is "completed" (has carried out all its actions) when
  88.     the system call returns.
  89.   - An asynchronous call returns immediately, even though the call might not
  90.     have completed. A parameter of the call specifies a "status word", which
  91.     the call initially sets to -46 (the error code meaning "not completed).
  92.     When the relevant action has been taken or event occurs, the call
  93.     is completed, the status word is changed to indicate the result of the
  94.     call, and an IOSIGNAL is sent to the process. [This is exactly the same
  95.     behaviour as the IOA keyword.]
  96.   - If a call is "vsync", then it may be made as either a synchronous or
  97.     asynchronous call:
  98.     + to make a synchronous call, set AL to zero (the parameter giving the
  99.       address of the status word will be ignored);
  100.     + to make an asynchronous call, set AL to any other value (the address
  101.       of the status word must be valid);
  102.     + descriptions of such calls will omit AL from the list of parameters.
  103.   - An asynchronous call may complete before returning (for example if the
  104.     relevant event has already happened). In this case the process will never
  105.     see the status word with the value -46, but an IOSIGNAL is still received.
  106.   - Some asynchronous calls have a corresponding "cancel" call. This causes
  107.     the original call to be completed with the status word set to some
  108.     negative value other than -46.
  109.  
  110. This is then followed by a list of the parameters and results used by the
  111. call; any parameter not listed is ignored. For the 5 main word results, the
  112. result (if the call does not fail) is the same as the corresponding parameter
  113. (including when the former is ignored) unless a different meaning is shown
  114. following an arrow (->). For the results AH, AL, and AX, and also the result
  115. flags, the result is unspecified if no such description is given.
  116.  
  117.  
  118. For example, consider the following (non-existent) system call:
  119. Fn $12 Sub $34
  120. GetMagicCookie fails
  121.     AX: -> magic cookie table entry zero
  122.     BX: table entry number
  123.     CX: -> magic cookie entry
  124.     SI: addend -> CX out + SI in
  125. Returns entries from the magic cookie table.
  126.  
  127. This system call could be used either by:
  128.     entry0% = CALL ($3412, entry%, 0, 0, addend%)
  129. which only returns magic cookie table entry zero, or by:
  130.     LOCAL regs%(6)
  131.     regs%(1)=$3400
  132.     regs%(2)=entryno%
  133.     regs%(5)=addend%
  134.     failed%=1 AND OS ($12, ADDR(regs%()))
  135.     REM regs%(2,4,6) have not changed
  136.     IF NOT failed
  137.         entry0%=regs%(1)
  138.         entry%=regs%(3)
  139.         REM regs%(5) will equal entry%+addend%
  140.     ELSE
  141.         REM regs%(1,3,5) are undefined
  142.         error%=regs%(1) and $FF00
  143.     ENDIF
  144. which returns much more information.
  145.  
  146.  
  147. System calls
  148. ------------
  149.  
  150. Note that some system calls are deliberately not described.
  151.  
  152.  
  153. Fn $80 Sub $00
  154. SegFreeMemory
  155.     AX: -> free memory
  156. Returns the amount of free system memory, in units of 16 bytes.
  157.  
  158.  
  159. Fn $80 Sub $01
  160. SegCreate fails
  161.     AL: segment type: ordinary processes should use 1.
  162.     AX: -> segment handle
  163.     BX: (cstr) name of the segment
  164.     CX: segment size in units of 16 bytes
  165. Creates an additional memory segment. Each segment must be given a name, of the
  166. form "8.3" (i.e. up to 8 characters, optionally followed by a dot and up to 3
  167. more characters). If the name is already in use, the call will fail. Once
  168. created, the segment may be used by the process as additional memory, either
  169. via SegCopyFrom and SegCopyTo, or in assembler code (see the Psionics file
  170. KERNEL).
  171.  
  172.  
  173. Fn $80 Sub $02
  174. SegDelete fails
  175.     BX: segment handle
  176. Deletes an additional memory segment. If any other process has opened the
  177. segment, the call will fail.
  178.  
  179.  
  180. Fn $80 Sub $03
  181. SegOpen fails
  182.     AX: -> segment handle
  183.     BX: (cstr) name of the segment
  184. Opens the additional memory segment with the given name (if no such segment
  185. exists, the call will fail). The call will fail if the process has the segment
  186. open already. Except where stated, all calls using additional memory segments
  187. must be given handles from SegCreate or SegOpen calls.
  188.  
  189.  
  190. Fn $80 Sub $04
  191. SegClose fails
  192.     BX: segment handle
  193. Closes an additional memory segment which the process has open. If this was the
  194. only process with the segment open, it is deleted. Open segments are closed
  195. when a process terminates.
  196.  
  197.  
  198. Fn $80 Sub $05
  199. SegSize
  200.     AX: -> segment size
  201.     BX: segment handle
  202. Returns the size of an additional memory segment in units of 16 bytes.
  203.  
  204.  
  205. Fn $80 Sub $06
  206. SegAdjustSize fails
  207.     BX: segment handle
  208.     CX: new size in units of 6 bytes
  209. Changes the size of an additional memory segment. The memory will be added to
  210. or removed from the end of the segment.
  211.  
  212.  
  213. Fn $80 Sub $07
  214. SegFind fails
  215.     AX: -> segment handle
  216.     BX: last segment handle
  217.     SI: address of 14 byte buffer used by the call
  218.     DI: (cstr) pattern to search for
  219. Finds the additional memory segments with names matching the search pattern
  220. (use ? and * as wild cards). The first call should be made with the last
  221. segment handle set to 0, and subsequent calls should set it to the handle
  222. returned by the previous call. The call fails when there are no more segments
  223. to return. It is not necessary to keep calling SegFind until this happens.
  224.  
  225.  
  226. Fn $80 Sub $08
  227. SegCopyTo
  228.     BX: segment handle
  229.     CX: number of bytes to copy
  230.     DX: high half of start address in segment
  231.     SI: address in process of first byte to copy
  232.     DI: low half of start address in segment
  233. Copies data from the current process to an additional memory segment.
  234.  
  235.  
  236. Fn $80 Sub $09
  237. SegCopyFrom
  238.     BX: segment handle
  239.     CX: number of bytes to copy
  240.     DX: high half of start address in segment
  241.     SI: address in process to copy first byte to
  242.     DI: low half of start address in segment
  243. Copies data from an additional memory segment to the current process.
  244.  
  245.  
  246. Fn $80 Sub $0A
  247. SegLock
  248.     BX: segment handle
  249. Locks an additional memory segment; a locked segment will not be deleted even
  250. if no processes have it open.
  251.  
  252.  
  253. Fn $80 Sub $0B
  254. SegUnLock
  255.     BX: segment handle
  256. Unlocks an additional memory segment. The number of unlock calls should equal
  257. the number of lock calls; additional unlocks may cause the segment to be
  258. deleted while still open.
  259.  
  260.  
  261. Fn $80 Sub $0C
  262. SegRamDiskUsed
  263.     AX: -> size of the ram disc in units of 16 bytes
  264. Returns the size of the ram disc; this should be treated carefully, as it
  265. can change without warning.
  266.  
  267.  
  268. Fn $80 Sub $0D
  269. SegCloseLockedOrDevice
  270.     BX: segment handle
  271. Unlocks an additional memory segment where the handle may be that for a
  272. different process. See SegUnLock for more details.
  273.  
  274.  
  275. Fn $81 Sub $00
  276. HeapAllocateCell fails
  277.     AX: -> allocated block
  278.     CX: number of bytes to allocate
  279. Allocates a block of memory from the heap. The returned block may be larger
  280. than requested. Heap memory is part of the process's normal memory segment.
  281.  
  282.  
  283. Fn $81 Sub $01
  284. HeapReAllocateCell fails
  285.     AX: -> new address of block
  286.     BX: block to be reallocated, or zero
  287.     CX: new size of block in bytes
  288. Changes the size of a heap block; the block may have to be moved to do this.
  289. The memory will be added or deleted to the end of the block. If the call fails,
  290. the block is unaffected. If BX is zero, then a new cell is allocated. The new
  291. block may be larger than requested.
  292.  
  293.  
  294. Fn $81 Sub $02
  295. HeapAdjustCellSize fails
  296.     AX: -> new address of block
  297.     BX: block to be adjusted (must not be zero)
  298.     CX: number of bytes to add or remove
  299.     DX: location within block of the change
  300. Changes the size of a heap block; the block may have to be moved to do this.
  301. If the call fails, the block is unaffected. The memory will be added or removed
  302. at the offset given by DX. For example, if the block was 10 bytes long, CX is
  303. 3, and DX is 6, the new block will be 13 bytes, and consist of the first 6
  304. bytes of the old block, then 3 random bytes, then the last 4 bytes of the old
  305. block. The new block may be larger than requested.
  306.  
  307.  
  308. Fn $81 Sub $03
  309. HeapFreeCell
  310.     BX: block to free
  311. Frees a previously allocated heap block.
  312.  
  313.  
  314. Fn $81 Sub $04
  315. HeapCellSize
  316.     AX: -> cell size in bytes
  317.     BX: address of block
  318. Returns the actual size of a heap block (which may be larger than requested
  319. when the block was created or last resized).
  320.  
  321.  
  322. Fn $81 Sub $05
  323. HeapSetGranularity
  324.     BX: new granularity in units of 16 bytes
  325. When the application data space is not large enough to satisfy a heap request,
  326. it is grown by the granularity. The default is 2kb (128 units), and the
  327. maximum is 16k (1024 units).
  328.  
  329.  
  330. Fn $81 Sub $06
  331. HeapFreeMemory
  332.     AX: -> maximum possible free space on heap
  333.     BX: -> address of start of heap
  334. Returns the amount of heap space which can be allocated (by using freed blocks
  335. or by growing the data space, or both), plus the address of the base of the
  336. heap.
  337.  
  338.  
  339. Fn $82 Sub $00
  340. SemCreate fails
  341.     AX: -> semaphore handle
  342.     BX: initial value of semaphore
  343. Creates a new semaphore for process interlocking. Each semaphore has a list of
  344. processes associated with it (this list is initially empty) and a value, which
  345. must initially be zero or positive.
  346.  
  347.  
  348. Fn $82 Sub $01
  349. SemDelete
  350.     BX: semaphore handle
  351. Deletes a semaphore. Any processes on the semaphore's list will be restarted.
  352. When a process terminates, any semaphore it created will be deleted.
  353.  
  354.  
  355. Fn $82 Sub $02
  356. SemWait
  357.     BX: semaphore handle
  358. If the value of the semaphore is positive or zero, one is subtracted from it.
  359. If the value is now or initially -1, the current process is then blocked and
  360. added to the end of the list for that semaphore.
  361.  
  362.  
  363. Fn $82 Sub $03
  364. SemSignalOnce
  365.     BX: semaphore handle
  366. If the list for the semaphore is not empty, the first process on the list is
  367. removed and restarted. If the list is empty (either initially or after the
  368. only process is removed), one is added to the value of the semaphore. If the
  369. restarted process has a higher priority than the current one, a reschedule
  370. will take place and the other process will start running (see the description
  371. of priorities in the Psionics file PROCESS).
  372.  
  373.  
  374. Fn $82 Sub $04
  375. SemSignalMany
  376.     BX: semaphore handle
  377.     CX: number of calls to make (must be positive)
  378. This is equivalent to making several calls to SemSignalOnce.
  379.  
  380.  
  381. Fn $82 Sub $05
  382. SemSignalOnceNoReSched
  383.     BX: semaphore handle
  384. This is identical to SemSignalOnce except that a reschedule never takes place
  385. because of the call (though one may take place due to the current process using
  386. up its time slot).
  387.  
  388.  
  389. Fn $83 Sub $00
  390. MessInit fails
  391.     BX: number of message slots + 256 * maximum data length
  392. Initialize the message system so that the current process can receive
  393. inter-process messages. The call reserves the indicated number of message
  394. slots, with each slot having room for the indicated amount of data. The slots
  395. are allocated on the heap.
  396.  
  397.  
  398. Fn $83 Sub $01
  399. MessReceiveAsynchronous async
  400.     BX: address of message slot pointer
  401.     DI: address of the status word
  402. When a message arrives, the message slot pointer is set to the address of the
  403. message, the status word is set to zero, and the call completes. The message
  404. has the format:
  405.   Offset  0 to   3: used by the message system
  406.   Offset  4 (word): message type
  407.   Offset  6 (word): process sending the message
  408.   Offset  8 onward: data in message
  409.  
  410.  
  411. Fn $83 Sub $02
  412. MessReceiveWithWait
  413.     BX: address of message slot pointer
  414. When a message arrives (this may have happened before the call; otherwise the
  415. call waits until a message arrives), the message slot pointer is set to the
  416. address of the message. The message format is as for MessReceiveAsynchronous.
  417.  
  418.  
  419. Fn $83 Sub $03
  420. MessReceiveCancel
  421. Cancel any pending MessReceiveAsynchronous.
  422.  
  423.  
  424. Fn $83 Sub $04
  425. MessSend fails
  426.     BX: process to receive the message
  427.     CX: message type
  428.     SI: address of first byte of message data
  429. Send a message to a process. The call will block until there is a free message
  430. slot in the receiving process. The receiving process determines the amount of
  431. data sent. The reply is ignored.
  432.  
  433.  
  434. Fn $83 Sub $05
  435. MessSendReceiveAsynchronous fails async
  436.     BX: process to receive the message
  437.     CX: message type
  438.     SI: address of first byte of message data
  439.     DI: address of the status word
  440. Send a message to a process; when the recipient replies, the status word is
  441. set to the reply and the process is sent an IOSIGNAL. The call will block until
  442. there is a free message slot in the receiving process.
  443.  
  444.  
  445. Fn $83 Sub $06
  446. MessSendReceiveWithWait fails
  447.     AX: -> reply
  448.     BX: process to receive the message
  449.     CX: message type
  450.     SI: address of first byte of message data
  451. Send a message to a process, and blocks until the recipient replies.
  452.  
  453.  
  454. Fn $83 Sub $07
  455. MessFree
  456.     BX: address of received message
  457.     CX: reply
  458. The reply is sent to the recipient of the message, and the message slot is
  459. freed and can be used for another incoming message.
  460.  
  461.  
  462. Fn $83 Sub $08
  463. MessSignal fails
  464.     BX: process to watch
  465.     CX: message type
  466. Requests that, when the specified process terminates, the kernel sends a
  467. message of the indicated type to the current process. The data in the message
  468. has the format:
  469.   Offset  0 (word): process id of terminating process
  470.   Offset  2 (byte): reason code (see ProcKill) or panic code
  471.   Offset  3 (byte):
  472.     0 = process terminated or was killed
  473.     1 = process caused a panic
  474.     2 = a subtask of the process caused a panic in the process
  475. If the message slots do not have room for 4 bytes of data, not all this
  476. information is available.
  477.  
  478.  
  479. Fn $83 Sub $09
  480. MessSignalCancel fails
  481. Fn $83 Sub $0A
  482. MessSignalCancelX fails
  483.     BX: process to watch
  484.     CX: message type (MessSignalCancelX only)
  485. Cancels a call to MessSignal for the indicated process. MessSignalCancel
  486. ignores the message type and should not be used if more than one MessSignal
  487. call has been made for the process.
  488.  
  489.  
  490. Fn $84 is used to control dynamic libraries and is not described here.
  491.  
  492.  
  493. Fn $85 Sub $00
  494. IoOpen fails
  495.     AX: -> handle of opened device
  496.     BX: (cstr) name of device driver
  497.     CX: mode
  498.     DX: handle of device being attached to
  499. Opens a channel to a device driver. If the driver is a base driver, then
  500. DX is ignored (and this call is equivalent to the IOOPEN keyword). If it is
  501. a stacked driver (see the Psionics file DEVICES), then the handle to be
  502. stacked on must be specified. The meaning of the mode is determined by the
  503. device. A driver can support several channels at once, and each has its own
  504. handle. The driver must be a logical device driver.
  505.  
  506.  
  507. Fn $85 Sub $01 and $02 involve physical device drivers and should only be
  508. called from within logical device drivers.
  509.  
  510.  
  511. Fn $85 Sub $03 to $05 should only be used by the operating system.
  512.  
  513.  
  514. Fn $85 Sub $06
  515. DevLoadLDD fails
  516. Fn $85 Sub $07
  517. DevLoadPDD fails
  518.     BX: (cstr) name of file holding the driver
  519. Loads a device driver into the system. A driver cannot be opened until it is
  520. loaded. The correct call for the driver type must be used.
  521.  
  522.  
  523. Fn $85 Sub $08
  524. DevDelete fails
  525.     BX: (cstr) name of the device driver
  526.     DX: $DD01 for logical device drivers, or $DD21 for physical device drivers
  527. Unloads a device driver from the system. Open drivers and those in the ROM
  528. cannot be unloaded.
  529.  
  530.  
  531. Fn $85 Sub $09
  532. DevQueryUnits fails
  533.     AX: -> number of channels supported
  534.     BX: (cstr) name of the device driver
  535. Returns the number of simultaneous open channels supported by a driver (which
  536. must be a logical one); $FFFF indicates no limit.
  537.  
  538.  
  539. Fn $85 Sub $0A
  540. DevFind fails
  541.     AX: -> find code
  542.     BX: last find code
  543.     DX: $DD01 for logical device drivers, or $DD21 for physical device drivers
  544.     SI: address of 14 byte buffer
  545.     DI: (cstr) pattern to search for
  546. Finds all devices with names matching the search pattern (use ? and * as wild
  547. cards). The first call should be made with the last find code set to 0, and
  548. subsequent calls should set it to the code returned by the previous call. The
  549. call fails when there are no more drivers to return. It is not necessary to
  550. keep calling DevFind until this happens.
  551.  
  552.  
  553. Fn $85 Sub $0B should only be used by the operating system.
  554.  
  555.  
  556. Fn $85 Sub $0C is used for special operations on device drivers.
  557.  
  558.  
  559. Fn $86 Sub $00
  560. IoAsynchronous fails async
  561. Fn $86 Sub $01
  562. IoAsynchronousNoError async
  563. Fn $86 Sub $02
  564. IoWithWait fails
  565.     AL: service number
  566.     AX: -> result from driver
  567.     BX: handle of driver
  568.     CX: address of first argument
  569.     DX: address of second argument
  570.     DI: address of the status word (ignored by IoWithWait)
  571. These calls are equivalent to the IOA, IOC, and IOW keywords respectively
  572. [For those without documentation of IOC, this is the same as IOA, except that
  573. errors are handled by setting the status word and calling IOSIGNAL, so that
  574. IOC always succeeds, unlike IOA.]
  575.  
  576.  
  577. Fn $86 Sub $03 and $04 should only be used by device drivers.
  578.  
  579.  
  580. Fn $86 Sub $05
  581. IoWaitForSignal
  582. This call is equivalent to the IOWAIT keyword.
  583.  
  584.  
  585. Fn $86 Sub $06
  586. IoWaitForStatus
  587.     DI: address of the status word
  588. This call is equivalent to the IOWAIT keyword.
  589.  
  590.  
  591. Fn $86 Sub $07
  592. IoYield
  593.     DI: address of the status word
  594. This call is equivalent to the IOYIELD keyword.
  595.  
  596.  
  597. Fn $86 Sub $08
  598. IoSignal
  599. Sends an IOSIGNAL to the current process. This call is equivalent to the
  600. IOSIGNAL keyword.
  601.  
  602.  
  603. Fn $86 Sub $09
  604. IoSignalByPid fails
  605. Fn $86 Sub $0A
  606. IoSignalByPidNoReSched fails
  607.     BX: process ID
  608. Sends an IOSIGNAL to a process. With the latter call a reschedule never takes
  609. place because of the call (though one may take place due to the current
  610. process using up its time slot).
  611.  
  612.  
  613. Fn $86 Sub $0B to $0F should only be used by device drivers.
  614.  
  615.  
  616. Fn $86 Sub $10
  617. IoClose fails
  618.     AX: -> result from driver
  619.     BX: handle
  620. This call is equivalent to the IOCLOSE keyword.
  621.  
  622.  
  623. Fn $86 Sub $11
  624. IoRead fails
  625. Fn $86 Sub $12
  626. IoWrite fails
  627.     AX: -> amount actually read or result from driver
  628.     BX: handle
  629.     CX: address of buffer
  630.     DX: number of bytes read or written
  631. These calls are equivalent to the IOREAD and IOWRITE keywords.
  632.  
  633.  
  634. Fn $86 Sub $13
  635. IoSeek fails
  636.     AX: -> result from driver
  637.     BX: handle
  638.     CX: mode
  639.     DX: address of long holding seek position
  640. This call is equivalent to the IOSEEK keyword.
  641.  
  642.  
  643. Fn $86 Sub $14 should only be used by the window manager.
  644.  
  645.  
  646. Fn $86 Sub $15 to $17 should only by used from assembler.
  647.  
  648.  
  649. Fn $86 Sub $18
  650. IoShiftStates
  651.     AL: modifiers
  652. This call makes available the state of the various modifier keys:
  653.   Bit 1: shift
  654.   Bit 2: control
  655.   Bit 3: psion
  656.  
  657.  
  658. Fn $86 Sub $19
  659. IoWaitForSignalNoHandler
  660. This call should be used instead of IOSEEK by tasks (subsidiary processes of
  661. a process).
  662.  
  663.  
  664. Fn $86 Sub $1A
  665. IoSignalKillAsynchronous fails async
  666.     BX: process to watch
  667.     DI: address of the status word
  668. This call completes, and the status word is set to 0,  when the specified
  669. process terminates.
  670.  
  671.  
  672. Fn $86 Sub $1B
  673. IoSignalKillCancel fails
  674.     BX: process to watch
  675. Cancel any pending IoSignalKillAsynchronous.
  676.  
  677.  
  678. Fn $86 Sub $1C and $1D should only be used by the window manager.
  679.  
  680.  
  681. Fn $86 Sub $1E
  682. IoPlaySoundW v3
  683.     AL: -> failure code
  684.     BX: (cstr) sound file name
  685.     CX: duration to play (in 1/32 second)
  686.     DX: volume: 0 (loudest) to 5 (softest)
  687. Plays a sound file. A duration of 0 means the file header specifies the
  688. duration; otherwise, the sound is clipped or padded with space as needed.
  689. The name may be either an ordinary filename, or a string of the form "*ABCD",
  690. meaning the first found of the files:
  691.     ROM::ABCD.WVE
  692.     LOC::M:\WVE\ABCD.WVE
  693.     LOC::A:\WVE\ABCD.WVE
  694.     LOC::B:\WVE\ABCD.WVE
  695. Note that this call does not fail in the usual way, but just returns a failure
  696. code.
  697.  
  698.  
  699. Fn $86 Sub $1F
  700. IoPlaySoundA v3 async
  701.     BX: (cstr) sound file name
  702.     CX: duration to play (in 1/32 second)
  703.     DX: volume: 0 (loudest) to 5 (softest)
  704.     DI: address of the status word
  705. Plays a sound file asynchronously; the call completes when the sound has
  706. finished. The other arguments are as for IoPlaySoundW.
  707.  
  708.  
  709. Fn $86 Sub $20
  710. IoPlaySoundCancel v3
  711. Cancel any pending IoPlaySoundA.
  712.  
  713.  
  714. Fn $86 Sub $21
  715. IoRecordSoundW v3
  716.     AL: -> failure code
  717.     BX: (cstr) sound file name
  718.     CX: number of samples to record, in units of 2048 samples
  719. Records a sound file. Note that 2048 samples are slightly more than a quarter
  720. of a second. The file will be created before recording, and must not be on
  721. a flash device. Note that this call does not fail in the usual way, but just
  722. returns a failure code.
  723.  
  724.  
  725. Fn $86 Sub $22
  726. IoRecordSoundA v3 async
  727.     BX: (cstr) sound file name
  728.     CX: number of samples to record, in units of 2048 samples
  729.     DI: address of the status word
  730. Records a sound file asynchronously; the call completes when the recording has
  731. finished. The other arguments are as for IoRecordSoundW.
  732.  
  733.  
  734. Fn $86 Sub $23
  735. IoRecordSoundCancel v3
  736. Cancel any pending IoRecordSoundA.
  737.  
  738.  
  739. Fn $87 Sub $00 is carried out automatically for OPL programs.
  740.  
  741.  
  742. Fn $87 Sub $01
  743. FilExecute fails vsync
  744.     BX: (cstr) program name
  745.     CX: (qstr) program information
  746.     DX: address of the status word
  747.     DI: address of word to be filled with process ID of new process
  748. Starts a new process and places it in "suspended" state. The program
  749. information is a qstr which normally consists of the following catenated
  750. together (note that all these elements except the first are cstrs):
  751. (1) the character 'C' (create new file) or 'O' (open existing file);
  752. (2) (cstr) the application name, with the first character uppercased and the
  753.     rest lowercased;
  754. (3) (cstr) one of:
  755.     (a) the normal extension for filenames, including the leading dot;
  756.     (b) the normal extension with dot, followed by a space and aliasing
  757.         information;
  758.     (c) an empty string
  759. (4) (cstr) the data file path passed as the initial argument;
  760. (5) (cstr) the application path (may be omitted if not required).
  761.  
  762. A binary application may be used to operate on a standard file type. Examples
  763. include:
  764.     Program                  Application  Extension
  765.                              [item 2]     [item 3]
  766.     "ROM::DATA.APP"          "Data"       ".DBF"
  767.     "ROM::WORD.APP"          "Word"       ".WRD"
  768.     "ROM::WORD.APP"          "Program"    ".OPL"
  769.     "LOC::C:\APP\COMMS.APP"  "Comms"      ".SCO"
  770.  
  771. In each of these cases there is no aliasing information or application path.
  772. An example program information qstr is "OData~.DBF~LOC::M:\DBF\MYDATA.DBF~"
  773. (tilde indicates a zero byte).
  774.  
  775. @This section needs rewriting@
  776. The word processor may also be used as a program editor, by making item 2
  777. its name ("Program") and item 3 an extension (usually ".OPL") followed by the
  778. necessary aliasing information: "OROPO", where the first O is the last letter
  779. of the name of the translator "ROM::SYS$PRGO" (and can be changed if other
  780. translators are available), the R indicates that the translator can execute
  781. resulting code [I don't know what value to use if it can't], and OPO is the
  782. extension of translated files. An example program information qstr is
  783. "Program~.OPL OROPO~LOC::M:\OPL\MYPROG.OPL~"
  784.  
  785. Finally, a translator may be used to execute a translated file: in the case
  786. of the translator "ROM::SYS$PRGO", it can execute either OPO or OPA files.
  787. The application name is given in the APP ... ENDA clause for OPA files, and
  788. is "RunOpl" for OPO files; there is no extension or aliasing information.
  789. For OPA files, the data file is passed to the application, and the application
  790. path shows which application is actually run. For OPO files, the data file
  791. should name the OPO file itself, and there is no application path. Examples
  792. are "RunOpl~~M:\OPO\MYPROG.OPO~" and "MyApp~~M:\DAT\MYDATA~M:\APP\MYAPP.OPA~".
  793.  
  794.  
  795. Fn $87 Sub $02
  796. FilParse fails vsync
  797.     BX: (cstr) file name to be parsed
  798.     CX: (cstr) file specification to be used
  799.     DX: address of the status word
  800.     SI: address of a 6 byte buffer to be filled in
  801.     DI: address of 128 byte buffer to be filled with the parsed filename
  802. This call is equivalent to the PARSE$ keyword. The buffer is filled as follows:
  803.   Offset  0 (byte): length of node name
  804.   Offset  1 (byte): length of device name
  805.   Offset  2 (byte): length of path name
  806.   Offset  3 (byte): length of base name
  807.   Offset  4 (byte): length of extension
  808.   Offset  5 (byte): flags
  809.     Bit 0: the base name or extension contains a wildcard ("*" or "?")
  810.     Bit 1: the base name contains a wildcard
  811.     Bit 2: the extension contains a wildcard
  812.  
  813.  
  814. Fn $87 Sub $03
  815. FilPathGet fails vsync
  816.     BX: 128 byte buffer
  817.     DX: address of the status word
  818. The buffer is filled with the current filing system default path (a cstr).
  819.  
  820.  
  821. Fn $87 Sub $04
  822. FilPathSet fails vsync
  823.     BX: (cstr) new path
  824.     DX: address of the status word
  825. Sets the default path (equivalent to the SETPATH keyword).
  826.  
  827.  
  828. Fn $87 Sub $05
  829. FilPathTest fails vsync
  830.     BX: (cstr) pathname to be tested
  831.     DX: address of the status word
  832. Equivalent to the EXIST keyword; the call succeeds if the file with that
  833. pathname exists.
  834.  
  835.  
  836. Fn $87 Sub $06
  837. FilDelete fails vsync
  838.     BX: (cstr) pathname to be deleted
  839.     DX: address of the status word
  840. Equivalent to the DELETE keyword; non-empty directories cannot be deleted.
  841.  
  842.  
  843. Fn $87 Sub $07
  844. FilRename fails vsync
  845.     BX: (cstr) old pathname
  846.     CX: (cstr) new pathname
  847.     DX: address of the status word
  848. Equivalent to the RENAME keyword.
  849.  
  850.  
  851. Fn $87 Sub $08
  852. FilStatusGet fails async
  853.     BX: (cstr) filename
  854.     CX: 16 byte buffer
  855.     DX: address of the status word
  856.     SI: 0
  857.     DI: 0
  858. The buffer is filled in with information about the file:
  859.   Offset  0 (word): buffer format version: always 2
  860.   Offset  2 (word): attributes
  861.   Offset  4 (long): file size in bytes
  862.   Offset  8 (long): time last modified
  863.  
  864. The attribute bits have the following meanings (question marks indicate that
  865. the bit name was specified but the meaning is unknown; equals signs mean that
  866. the bit can be set by FilStatusSet):
  867.   = Bit  0: file is not ReadOnly
  868.   = Bit  1: file is Hidden
  869.   = Bit  2: file is a System file
  870.     Bit  3: file is a Volume name
  871.     Bit  4: file is a Directory
  872.   = Bit  5: file is Modified
  873.   ? Bit  8: file is a readable file
  874.   ? Bit  9: file is an executable file
  875.   ? Bit 10: file is a byte stream file
  876.     Bit 11: file is a text file
  877. The LOC:: node (see Psionics file FILEIO) does not distinguish text and binary
  878. files, and always leaves bit 11 clear. Other nodes may distinguish the types of
  879. files and set the bit where appropriate.
  880.  
  881.  
  882. Fn $87 Sub $09
  883. FilStatusSet fails vsync
  884.     BX: (cstr) filename
  885.     CX: mask of attributes to be changed (only specify settable bits)
  886.     DX: address of the status word
  887.     SI: 0
  888.     DI: new values for attributes to be altered
  889. The attributes indicated in the mask of the specified file are altered to
  890. the new values; all other attributes are left unchanged.
  891.  
  892.  
  893. Fn $87 Sub $0A AL sync
  894. FilStatusDevice fails vsync
  895.     BX: (cstr) device name (such as "A:" or "LOC::A:")
  896.     CX: 64 byte buffer
  897.     DX: address of the status word
  898. The buffer is filled in with information about the device:
  899.   Offset  0 (word): buffer format version
  900.   Offset  2 (byte): device type
  901.     0 = unknown
  902.     1 = floppy
  903.     2 = hard disc
  904.     3 = flash
  905.     4 = ram
  906.     5 = rom
  907.     6 = write-protected
  908.   Offset  3 (byte): device properties:
  909.     Bit 3: formattable device
  910.     Bit 4: dual density device
  911.     Bit 5: internal device
  912.     Bit 6: dynamically sizeable device
  913.     Bit 7: compressible (worth compressing database files)
  914.   Offset  4 (word): non-zero if the device contains removable media
  915.   Offset  6 (long): total space on the device in bytes
  916.   Offset 10 (long): free space on the device in bytes
  917.   Offset 14 (cstr): volume name
  918.   Offset 46 (word): device battery status
  919.     0  = low battery
  920.     1  = battery OK
  921.     -4 = status not available for this device type
  922.     This field is not valid if the format version (offset 0) is less than 3.
  923.  
  924.  
  925. Fn $87 Sub $0B
  926. FilStatusSystem fails vsync
  927.     BX: (cstr) node name (such as "LOC::" or "REM::")
  928.     CX: 32 byte buffer
  929.     DX: address of the status word
  930. The buffer is filled in with information about the node:
  931.   Offset  0 (word): buffer format version (currently 2)
  932.   Offset  2 (word): 0 = flat, 1 = hierarchical
  933.   Offset  4 (word): non-zero if devices are formattable, and zero otherwise
  934.  
  935.  
  936. Fn $87 Sub $0C
  937. FilMakeDirectory fails vsync
  938.     BX: (cstr) pathname
  939.     DX: address of the status word
  940. This is equivalent to the MKDIR keyword.
  941.  
  942.  
  943. Fn $87 Sub $0D AL sync
  944. FilOpenUnique fails vsync
  945.     BX: (cstr) pathname
  946.     CX: open mode (format and access parts only)
  947.     DX: address of the status word
  948. Open a file with a unique name. This is equivalent to the IOOPEN keyword with
  949. a mode of 4. The pathname is used to determine the directory to create
  950. the file in, and will be modified to give the actual name (thus the pathname
  951. should have room for 128 characters).
  952.  
  953.  
  954. Fn $87 Sub $0E
  955. FilSystemAttach fails vsync
  956.     BX: (cstr) name of a file system PDD
  957.     DX: address of the status word
  958. The specified physical device driver will be attached to the filing system,
  959. possible adding new nodes.
  960.  
  961.  
  962. Fn $87 Sub $0F
  963. FilSystemDetach fails vsync
  964.     BX: (cstr) name of a filing system
  965.     DX: address of the status word
  966. Detaches a filing system. Built-in filing systems cannot be detached.
  967.  
  968.  
  969. Fn $87 Sub $10
  970. FilPathGetById fails vsync
  971.     BX: process to examine
  972.     CX: 128 byte buffer
  973.     DX: address of the status word
  974. The buffer is set to the current path of the specified process (a cstr).
  975.  
  976.  
  977. Fn $87 Sub $11
  978. FilChangeDirectory fails vsync
  979.     BX: (cstr) pathname
  980.     CX: 128 byte buffer
  981.     DX: address of the status word
  982.     DI: 0 = get root directory, 1 = get parent directory, 2 = get subdirectory
  983.     SI: (cstr) name of subdirectory
  984. The path name is modified in the requested way. This call should be used
  985. instead of manipulating the directory part of a name directly, as it works on
  986. all nodes, irrespective of the format that the node uses for path names.
  987.  
  988.  
  989. Fn $87 Sub $12 has no effect on OPL processes.
  990.  
  991.  
  992. Fn $87 Sub $13
  993. FilSetFileDate fails vsync
  994.     BX: (cstr) pathname
  995.     CX: low word of new time
  996.     DX: address of the status word
  997.     DI: high word of new time
  998. Sets the modification time of the specified file.
  999.  
  1000.  
  1001. Fn $87 Sub $14
  1002. FilLocChanged fails vsync
  1003.     AX: -> channel change flags
  1004.     BX: channel to check
  1005.     DX: address of the status word
  1006. Specifies whether any directory in the LOC:: node has changed (i.e. a file
  1007. or directory has been created, destroyed, or renamed, but not changes to file
  1008. contents) since the last use of this system call with this channel. BX should
  1009. have exactly one bit set, corresponding to the channel to use; bits 8 to 15
  1010. are reserved by Psion. The corresponding bit in AX will be set if the node
  1011. has changed, and will be clear otherwise; the other 15 bits are unspecified.
  1012. This call can be used to determine whether to update a directory display.
  1013.  
  1014.  
  1015. Fn $87 Sub $15
  1016. FilLocDevice v3 fails vsync
  1017.     BX: local device indicator (%A to %H, or %I or %M)
  1018.     CX: address of word set to the media type
  1019.     DX: address of the status word
  1020. Provides the media type of a device on the LOC:: node (I and M both refer to
  1021. the internal ramdisc). The device type consists of:
  1022.   Bits 0 to 3:
  1023.     0 = unknown
  1024.     1 = floppy
  1025.     2 = hard disc
  1026.     3 = flash
  1027.     4 = ram
  1028.     5 = rom
  1029.     6 = write-protected
  1030.   Bits 7 to 8:
  1031.     0 = device battery measurement not supported
  1032.     1 = device battery measurement not supported
  1033.     2 = device battery voltage low
  1034.     3 = device battery voltage good
  1035.  
  1036.  
  1037. Fn $87 Sub $16
  1038. FilLocReadPDD v3 fails vsync
  1039.     BX: local device indicator (%A to %H, or %I or %M)
  1040.     CX: (long) location on the device
  1041.     DX: address of the status word
  1042.     SI: number of bytes to read
  1043.     DI: address in process to copy first byte to
  1044. Copies data from a device on the LOC:: node to the current process. This
  1045. call is very efficient, and accesses the raw device.
  1046.  
  1047.  
  1048.  
  1049. Further system calls are described in Psionics file SYSCALLS.2.
  1050.